
#include "dbTable.h"
#include <algorithm>



bool dbTable::AppendCols(size_t numCols)
{
	cols_stat.resize(dt_cols+numCols);
	for(unsigned int i=dt_cols; i<dt_cols+numCols; i++)
	{
		cols_stat[i].cHeader=wxString::Format(wxT("Column%d"), i);
		cols_stat[i].cIndex=i;
		cols_stat[i].cSStat=DT_UNSORTED;
	}
	dt_cols+=numCols; 
	
	return true; 
}


bool dbTable::AppendRows(size_t numRows)
{ 
	dt_rows+=numRows;
	std::vector<wxVariant> a;
	a.resize(dt_cols); 
	dt_data.push_back(a);
	return true; 
}

void dbTable::Sort(int col)
{
	switch(cols_stat[col].cType)
	{
		case COLUMN_INTEGER:
		{
			SortINT(col);
			break;
		}
		case COLUMN_DATE:
		{
			SortDT(col);
			break;
		}
	}
}

void dbTable::SortINT(int col)
{
	wxString a=dt_data[0][col].GetType();
	std::vector<std::vector<wxVariant>>::iterator I,V;
	std::vector<wxVariant> temp_v;
	switch(cols_stat[col].cSStat)
	{
	case DT_UNSORTED:
	case DT_Z_A:
		{
			int  pos=0,min_v=dt_data.front()[col].GetInteger();
			for (unsigned int i=0; i<dt_data.size(); i++)
			{
				if (dt_data[i][col].GetInteger()<min_v)
				{
					min_v = dt_data[i][col].GetInteger();
					pos=i;
				}
			}
			dt_data.front().swap(dt_data[pos]);
			for (I = dt_data.begin()+1; I!=dt_data.end(); ++I)
			{
				temp_v=(*I);
				for (V=I-1; V!=dt_data.begin() && (*V)[col].GetInteger()>temp_v[col].GetInteger(); --V)
				{
					(*(V+1)).swap(*V);
				}
				(*(V+1)).swap(temp_v);
			}
			cols_stat[col].cSStat=DT_A_Z;
			break;
		}
	case DT_A_Z:
		{
			int pos=0,max_v=dt_data.front()[col].GetInteger();
			for (unsigned int i=0; i<dt_data.size(); i++)
			{
				if (dt_data[i][col].GetInteger()>max_v)
				{
					max_v = dt_data[i][col].GetInteger();
					pos=i;
				}
			}
			dt_data[0].swap(dt_data[pos]);
			for (I = dt_data.begin()+1; I!=dt_data.end(); ++I)
			{
				temp_v=(*I);
				for (V=I-1; V!=dt_data.begin() && (*V)[col].GetInteger()<temp_v[col].GetInteger(); --V)
				{
					(*(V+1)).swap(*V);
				}
				(*(V+1)).swap(temp_v);
			}
			cols_stat[col].cSStat=DT_Z_A;
			break;
		}
	}

}

void dbTable::SortDT(int col)
{

	wxString a=dt_data[0][col].GetType();
	std::vector<std::vector<wxVariant>>::iterator I,V;
	std::vector<wxVariant> temp_v;
	switch(cols_stat[col].cSStat)
	{
	case DT_UNSORTED:
	case DT_Z_A:
		{
			int  pos=0;
			wxDateTime min_v=dt_data.front()[col].GetDateTime();
			for (unsigned int i=0; i<dt_data.size(); i++)
			{
				if (dt_data[i][col].GetDateTime()<min_v)
				{
					min_v = dt_data[i][col].GetDateTime();
					pos=i;
				}
			}
			dt_data.front().swap(dt_data[pos]);
			for (I = dt_data.begin()+1; I!=dt_data.end(); ++I)
			{
				temp_v=(*I);
				for (V=I-1; V!=dt_data.begin() && (*V)[col].GetDateTime()>temp_v[col].GetDateTime(); --V)
				{
					(*(V+1)).swap(*V);
				}
				(*(V+1)).swap(temp_v);
			}
			cols_stat[col].cSStat=DT_A_Z;
			break;
		}
	case DT_A_Z:
		{
			int pos=0;
			wxDateTime max_v=dt_data.front()[col].GetDateTime();
			for (unsigned int i=0; i<dt_data.size(); i++)
			{
				if (dt_data[i][col].GetDateTime()>max_v)
				{
					max_v = dt_data[i][col].GetDateTime();
					pos=i;
				}
			}
			dt_data[0].swap(dt_data[pos]);
			for (I = dt_data.begin()+1; I!=dt_data.end(); ++I)
			{
				temp_v=(*I);
				for (V=I-1; V!=dt_data.begin() && (*V)[col].GetDateTime()<temp_v[col].GetDateTime(); --V)
				{
					(*(V+1)).swap(*V);
				}
				(*(V+1)).swap(temp_v);
			}
			cols_stat[col].cSStat=DT_Z_A;
			break;
		}
	}
}




